package com.study.algorithm.binarytree;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

/**
 * 102. 二叉树的层序遍历
 */
public class LevelOrder {
    public List<List<Integer>> levelOrder(TreeNode root) {
        // 创建结果列表，用于存储每一层的节点值
        // 外层List表示所有层，内层List表示某一层的所有节点值
        List<List<Integer>> result = new ArrayList<>();

        // 处理空树的情况
        if (root == null) {
            return result;  // 返回空列表
        }
        // 创建队列，用于广度优先搜索(BFS)
        Queue<TreeNode> queue = new LinkedList<>();
        queue.offer(root);
        // 当队列不为空时，说明还有节点需要处理
        while (!queue.isEmpty()) {
            // 关键步骤：记录当前层的节点数量
            int levelSize = queue.size();
            // 创建当前层的列表，用于存储当前层所有节点的值
            List<Integer> currentLevel = new ArrayList<>();
            // 遍历当前层的所有节点
            for (int i = 0; i < levelSize; i++) {
                TreeNode currentNode = queue.poll();  // poll()在队列空时返回null
                // 将当前节点的值加入到当前层的列表中
                currentLevel.add(currentNode.val);
                // 检查当前节点是否有左子节点
                if (currentNode.left != null) {
                    queue.offer(currentNode.left);  // 左子节点入队
                }
                if (currentNode.right != null) {
                    queue.offer(currentNode.right);  // 右子节点入队
                }
            }
            result.add(currentLevel);
        }
        return result;
    }
}
